package cn.tqfeiyang.smartadmin.commons.toolbox;

import com.baomidou.mybatisplus.core.toolkit.StringPool;
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Service;

import java.util.*;

/**
 * 字符串工具类，对常用的字符串操作进行封装。
 *
 * @author tqfeiyang
 * @wechat 18576228047
 * @email 1787585212@qq.com
 * @date 2024/8/15 8:26
 */
public final class StringUtils {

    /**
     * 空字符串
     */
    public static final String EMPTY = StringPool.EMPTY;

    /**
     * 冒号
     */
    public static final String COLON = ":";

    /**
     * 逗号
     */
    public static final String COMMA = ",";

    /**
     * 判断字符串是否是 null 或者 长度为 0
     *
     * @param cs 需要判断的字符串
     * @return 如果字符串是 null 或者 长度为 0，返回 true
     */
    public static boolean isEmpty(CharSequence cs) {
        return com.baomidou.mybatisplus.core.toolkit.StringUtils.isEmpty(cs);
    }

    /**
     * @see StringUtils#isEmpty(CharSequence)
     */
    public static boolean isNotEmpty(CharSequence cs) {
        return com.baomidou.mybatisplus.core.toolkit.StringUtils.isNotEmpty(cs);
    }

    /**
     * 判断字符串中是否是 null 或者 全是空白字符
     *
     * @param cs 需要判断的字符串
     * @return 如果字符串序列是 null 或者全是空白，返回 true
     */
    public static boolean isBlank(CharSequence cs) {
        return com.baomidou.mybatisplus.core.toolkit.StringUtils.isBlank(cs);
    }

    /**
     * @see StringUtils#isBlank(CharSequence)
     */
    public static boolean isNotBlank(CharSequence cs) {
        return com.baomidou.mybatisplus.core.toolkit.StringUtils.isNotBlank(cs);
    }

    /**
     * 判断字符串是否是数字
     *
     * @param cs 输入字符串
     * @return 是否是数字
     */
    public static boolean isNumeric(final CharSequence cs) {
        return org.apache.commons.lang3.StringUtils.isNumeric(cs);
    }

    /**
     * 比较两个字符串，区分大小写。
     *
     * @param cs1
     * @param cs2
     * @return 比较结果
     */
    public static boolean equals(final CharSequence cs1, final CharSequence cs2) {
        return org.apache.commons.lang3.StringUtils.equals(cs1, cs2);
    }

    /**
     * 比较两个字符串，不区分大小写。
     *
     * @param cs1
     * @param cs2
     * @return 比较结果
     */
    public static boolean equalsIgnoreCase(final CharSequence cs1, final CharSequence cs2) {
        return org.apache.commons.lang3.StringUtils.equalsIgnoreCase(cs1, cs2);
    }

    public static boolean startsWith(final CharSequence str, final CharSequence prefix) {
        return org.apache.commons.lang3.StringUtils.startsWith(str, prefix);
    }

    public static boolean endsWith(final CharSequence str, final CharSequence suffix) {
        return endsWith(str, suffix);
    }

    /**
     * 字符串驼峰转下划线格式
     *
     * @param param 需要转换的字符串
     * @return 转换好的字符串
     */
    public static String camelToUnderline(String param) {
        return com.baomidou.mybatisplus.core.toolkit.StringUtils.camelToUnderline(param);
    }

    /**
     * 字符串下划线转驼峰格式
     *
     * @param param 需要转换的字符串
     * @return 转换好的字符串
     */
    public static String underlineToCamel(String param) {
        return com.baomidou.mybatisplus.core.toolkit.StringUtils.underlineToCamel(param);
    }

    /**
     * 驼峰转连字符
     * <p>StringUtils.camelToHyphen( "managerAdminUserService" ) = manager-admin-user-service</p>
     *
     * @param input ignore
     * @return 以'-'分隔
     * @see <a href="https://github.com/krasa/StringManipulation">document</a>
     */
    public static String camelToHyphen(String input) {
        return com.baomidou.mybatisplus.core.toolkit.StringUtils.camelToHyphen(input);
    }

    /**
     * 首字母转换小写
     *
     * @param param 需要转换的字符串
     * @return 转换好的字符串
     */
    public static String firstToLowerCase(String param) {
        return com.baomidou.mybatisplus.core.toolkit.StringUtils.firstToLowerCase(param);
    }

    /**
     * 首字母大写，其它字符不变。
     *
     * @param str 输入字符串
     * @return 首字母大写的字符串
     */
    public static String capitalize(String str) {
        return org.springframework.util.StringUtils.capitalize(str);
    }

    /**
     * 首字母小写，其它字符不变。
     *
     * @param str 输入字符串
     * @return 首字母小写的字符串
     */
    public static String uncapitalize(String str) {
        return org.springframework.util.StringUtils.uncapitalize(str);
    }

    /**
     * 将集合转换成分割字符串。
     *
     * @param coll 集合
     * @param delim 分割字符串
     * @param prefix 前字符串
     * @param suffix 后字符串
     * @return 分割的字符串
     */
    public static String collectionToDelimitedString(Collection<?> coll, String delim, String prefix, String suffix) {
        return org.springframework.util.StringUtils.collectionToDelimitedString(coll, delim, prefix, suffix);
    }

    /**
     * @see StringUtils#collectionToDelimitedString(Collection, String, String, String)
     */
    public static String collectionToDelimitedString(Collection<?> coll, String delim) {
        return collectionToDelimitedString(coll, delim, "", "");
    }

    /**
     * @see StringUtils#collectionToDelimitedString(Collection, String, String, String)
     */
    public static String collectionToCommaDelimitedString(Collection<?> coll) {
        return collectionToDelimitedString(coll, ",");
    }

    /**
     * @see StringUtils#collectionToDelimitedString(Collection, String, String, String)
     */
    public static String arrayToDelimitedString(Object[] arr, String delim) {
        return org.springframework.util.StringUtils.arrayToDelimitedString(arr, delim);
    }

    /**
     * @see StringUtils#collectionToDelimitedString(Collection, String, String, String)
     */
    public static String arrayToCommaDelimitedString(Object[] arr) {
        return arrayToDelimitedString(arr, ",");
    }

    /**
     * 分割字符串为数组格式
     *
     * @param str 输入字符串
     * @param delimiters 分割字符
     * @param trimTokens 去除空格
     * @param ignoreEmptyTokens 忽略控制
     * @return 字符串数组
     */
    public static String[] tokenizeToStringArray(String str, String delimiters,
                                                 boolean trimTokens, boolean ignoreEmptyTokens) {
        return org.springframework.util.StringUtils.tokenizeToStringArray(str, delimiters, trimTokens, ignoreEmptyTokens);
    }

    /**
     * @see StringUtils#tokenizeToStringArray(String, String, boolean, boolean)
     */
    public static String[] tokenizeToStringArray(@Nullable String str, String delimiters) {
        return tokenizeToStringArray(str, delimiters, true, true);
    }

    /**
     * 分割字符串为数组格式
     *
     * @param str 输入字符串
     * @param delimiter 分割字符
     * @param charsToDelete 删除的字符，例如 “\r\n\f" 可以删除所有的分行符号
     * @return 字符串数组
     */
    public static String[] delimitedListToStringArray(String str, String delimiter,
                                                      String charsToDelete) {
        return org.springframework.util.StringUtils.delimitedListToStringArray(str, delimiter, charsToDelete);
    }

    /**
     * @see StringUtils#delimitedListToStringArray(String, String, String)
     */
    public static String[] delimitedListToStringArray(String str, String delimiter) {
        return delimitedListToStringArray(str, delimiter, null);
    }

    /**
     * @see StringUtils#delimitedListToStringArray(String, String, String)
     */
    public static String[] commaDelimitedListToStringArray(String str) {
        return delimitedListToStringArray(str, ",");
    }

    /**
     * @see StringUtils#delimitedListToStringArray(String, String, String)
     */
    public static Set<String> commaDelimitedListToSet(String str) {
        return org.springframework.util.StringUtils.commaDelimitedListToSet(str);
    }

    /**
     * @see StringUtils#delimitedListToStringArray(String, String, String)
     */
    public static List<String> commaDelimitedListToList(String str) {
        String[] tokens = commaDelimitedListToStringArray(str);
        return new ArrayList<>(Arrays.asList(tokens));
    }
}
